'use client' import { useEffect, useState } from 'react' import { useParams } from 'next/navigation' import Link from 'next/link' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { ArrowLeft, Clock, Coins, MessageSquare, Wrench, CheckCircle, XCircle, Sparkles } from 'lucide-react' import { SessionWorkflow } from '@/components/session-workflow' import { SessionChatLog } from '@/components/session-chatlog' import { SessionAIAnalysis } from '@/components/session-ai-analysis' import type { SessionDetail } from '@/lib/session-detail' export default function SessionDetailPage() { const params = useParams() const sessionId = params.id as string const [detail, setDetail] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [activeTab, setActiveTab] = useState<'dialog' | 'workflow' | 'ai'>('dialog') useEffect(() => { async function load() { try { const res = await fetch(`/api/session?id=${sessionId}`) if (!res.ok) throw new Error('Session not found') const data = await res.json() setDetail(data) } catch (e) { setError((e as Error).message) } finally { setLoading(false) } } load() }, [sessionId]) if (loading) { return
Loading session...
} if (error || !detail) { return (
Back to sessions
{error || 'Session not found'}
) } const s = detail.stats return (
Back to sessions
Duration
{s.duration}
Tokens
{s.tokens.toLocaleString()}
Messages
{s.totalMessages}

{s.userTurns} user / {s.assistantTurns} assistant

Tool Calls
{s.toolCalls}
Success
{s.successCount}
Failures
0 ? 'text-destructive' : ''}`}>{s.failureCount}
{activeTab === 'dialog' && ( Chat Log {detail.chatLog.length} records )} {activeTab === 'workflow' && ( Workflow Tool calls, reasoning, and execution flow — {detail.workflowNodes.length} nodes )} {activeTab === 'ai' && }
) }